package com.bbs.toutiao.utils;

import cn.hutool.cache.Cache;
import cn.hutool.cache.CacheUtil;
import cn.hutool.core.date.DateUtil;
import com.bbs.toutiao.mapper.admin.ArticleMapper;
import com.bbs.toutiao.mapper.clinet.ClientUserEditorMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * 描述: 文章工具
 * 作者： zhangBin
 * 时间： 2024/3/13 23:30
 * 版本： 1.0
 */

@Slf4j
@Component
public class ArticleUtil {

    @Resource
    ArticleMapper articleMapper;

    @Resource
    ClientUserEditorMapper userEditorMapper;
    static Cache<Object, Object> cache = CacheUtil.newLFUCache(1000, 120 * 1000);


    /**
     * 防止刷浏览量
     * @param addr
     * @param id
     * @param userId
     */
    public  void currentProtection(String addr, int id,int userId) {
        // 获取当前时间
        Date now = DateUtil.date();
        // 按照指定格式对日期进行格式化为字符串，这里yyyy-MM-dd HH:mm:ss.SSS代表年-月-日 时:分:秒.毫秒
        String format = DateUtil.format(now, "yyyy-MM-dd HH:mm:ss");
        Map<String, Object> map = new HashMap<>();
        // 从缓存中获取数据
        Map<String, Object> value = (Map<String, Object>) cache.get(addr);

        // 向缓存中添加数据(在此例中为时间和令牌)
        String time = String.valueOf(System.currentTimeMillis());
        map.put("time", time);
        map.put("id", id);
        //超时或者过期则返回null
        if (value == null) {
            cache.put(addr, map, 1000 * 100);
            articleMapper.addCountByArticleId(id);
            if(userId>0){
                userEditorMapper.insertHistory(userId,id,format);
            }
        }
        if (value != null) {

            String time2 = value.get("time").toString();
            Object id1 = value.get("id");
            if (id1.equals(id)) {
                //id相同时判断时间是否大于
                //300秒
                if(Long.parseLong(time2)-Long.parseLong(time) > 300*1000){
                    articleMapper.addCountByArticleId(id);
                    if(userId>0){
                        userEditorMapper.insertHistory(userId,id,format);
                    }
                }
                log.info("您操作太频繁了");
            } else {
                cache.put(addr, map, 1000 * 100);
                articleMapper.addCountByArticleId(id);
                if(userId>0){
                    userEditorMapper.insertHistory(userId,id,format);
                }
            }
        }
    }
}
